<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>字面量</title>
	</head>
	<body>
	</body>
	<script>
		//为了让属性和方法更好的体现封装的效果，并且减少不必要的输入
		//原型的创建可以使用字面量的方式
		
		
		function Box(){}
		//使用字面量的方式创建对象，这里{}就是对象，是Object，new Object 相当于{}
		Box.prototype ={
			name:'lee',
			age:200,
			run:function(){
				return this.name +','+ this.age +','+ '运行中...';
			}
		};
		
		var box = new Box();
		alert(box.run());
		
		//与构造函数的区别，此时类型为Object
		alert(box.constructor);//function Object() { [native code] }
		alert(box.constructor==Box);//false
		//字面量方式为什么constructor 会指向Object?因为Box.prototype ={}这种写法其实就是创建了一个新的对象
		//而没创建一个函数就会同时创建它prototype,这个对象也会自动获取constructor属性。所有新对象的constructor重写了
		//Box原来的constructor因此指向新对象，那个新对象没有指定构造函数，那么就默认Object。
		
		
		
	//如果想让字面量的方式constructor指向实例对象，那么可以直接添加属性
		function Dies(){}
		Dies.prototype ={
			constructor:Dies,  //直接强制转换
		//	constructor:String, 
			name:'lee',
			age:200,
			run:function(){
				return this.name +','+ this.age +','+ '运行中...';
			}
		};
		var  dies = new Dies();
		alert(dies.constructor);//function Dies(){}
		alert(dies.constructor==Dies);//true
		
		
		
		//原型的声明是有先后顺序的，所有重写的原型会切断之前的原型
		
		//重写了原型对象
		Dies.prototype ={
			
			age:222,  //这里不会保留之前原型的任何信息
		};
		
		alert(dies.age);//200
		alert(dies.name)//lee
		
	 var dies1 = new Dies();//此时原型已经改变
		alert(dies1.age);//222
		alert(dies1.name);//undefined
		
		
		//数组排序方法
		var numbers =[5,2,8,11,25,4,5];
		alert(numbers.sort());//11,2,25,4,5,5,8
		
		//查看sort是否是Array原型对象里的方法
		alert(Array.prototype.sort);//function sort() { [native code] }
		alert(String.prototype.substring);//function substring() { [native code] }
		
		//内置引用的功能扩展
		//给String添加自定义方法
		//不推荐，可能造成命名冲突
		alert(String.prototype.addstring);//undefined  
		String.prototype.addstring =function(){
			return this+'添加了txt';
		}
		alert('lion'.addstring());//lion添加了txt
	</script>
</html>
